~GitHub/inattention-populationsample/code/inattention-populationsample-data-prep.Rmd

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code. Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter. Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I. When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

Abstract

Background

Inattentive behavior is associated with academic problems. The present study investigates primary school teacher reports on nine items reflecting different aspects of inattention, with an aim to reveal patterns of behavior predicting high-school academic achievement. To that end, we used different types of pattern analysis and machine learning methods.

Methods

Inattention in a sample 2397 individuals were rated by their primary school teachers when they participated in the first wave of the Bergen Child Study (BCS) (7 - 9 years old), and their academic achievements were available from an official school register when attending high-school (16 - 19 years old). Inattention was assessed by the nine items rated at a categorical leve, and the academic achievement scores were divided into three parts including a similar number of participants.

Results

Boys obtained higher inattention scores and lower academic scores than girls. Inattention problems related to sustained attention and distractibility turned out to have the highest predictive value of academic achievement level across all selected statistical analyses, and the full model showed that inattention explained about 10% of the variance in high school scores about 10 years later. A high odds-ration of being allocated to the lowest academic achievement category was shown by a multinominal regression analysis, while a pattern of problems related to sustained attention and distractibility was revealed by generating classification trees. By including recursive learning algorithms, the most successful classification was found between these inattention items and the highest level of achievement scores.

Summary

The present study showed the importance of a pattern of early problems related to sustained attention and distractibility in predicting future academic results. By including different statistical classification models we showed that this pattern was fairly consistent. Furthermore, calculation of classification errors gave information about the uncertainty when predicting the outcome for individual children. Further studies should include a wider range of variables.

Organization of the data and the analysis:

Libraries being used:

  • memisc - spss.system.file()
  • psych - headTail(), describe()
  • Hmisc - describe()
  • pander - pander(), panderOptions()

Data preparation

Input file:

  • inattention_Arvid_new.sav (from Astri, on ~/Dropbox/Arvid_inatteion/data2)
  • inattention_nomiss_2397x12.csv

Output files (data):

  • inattention_nomiss_2397x12_snap_is_0_1_2.csv
  • inattention_nomiss_2397x12_snap_is_0_1.csv
  • inattention_nomiss_2397x12_snap_is_0_1_2_outcome_is_L_M_H.csv (Low, Medium, High academic score)
  • inattention_nomiss_2397x12_snap_is_0_1_2_outcome_is_0_1_2.csv (all numerical)
  • inattention_nomiss_2397x12_snap_is_N_S_C_outcome_is_L_M_H.csv (Not, Somewhat, Certainly true)
# fn <- "../data2/inattention_Arvid_new.sav"
fn <- "../Dropbox/Arvid_inatteion/data2/inattention_Arvid_new.sav"
# The original SPSS file as provided to AJL is
# 'inattention_Astri_94_96_new_grades_updated.sav'
# and being edited and reduced by AJL to 'inattention_Arvid_new.sav'
# Import data stored in the SPSS format
library(memisc)
# fn <- "../data2/inattention_Arvid_new.sav"
fn <- "/Users/arvid/Dropbox/Arvid_inattention/data2/inattention_Arvid_new.sav"
data <- as.data.set(spss.system.file(fn))
# Make new data frame from the sample with the variables 
# gender, grade, SNAP1, ..., SNAP9 (vars #1-11) and
# academic_achievement (var #52) 
names(data)
 [1] "gender"               "grade"                "snap1"               
 [4] "snap2"                "snap3"                "snap4"               
 [7] "snap5"                "snap6"                "snap7"               
[10] "snap8"                "snap9"                "snap10"              
[13] "snap11"               "snap12"               "snap13"              
[16] "snap14"               "snap15"               "snap16"              
[19] "snap17"               "snap18"               "y_4_asrs_1"          
[22] "y_4_asrs_2"           "y_4_asrs_3"           "y_4_asrs_4"          
[25] "y_4_asrs_5"           "y_4_asrs_6"           "y_4_asrs_7"          
[28] "y_4_asrs_8"           "y_4_asrs_9"           "y_4_asrs_10"         
[31] "y_4_asrs_11"          "y_4_asrs_12"          "y_4_asrs_13"         
[34] "y_4_asrs_14"          "y_4_asrs_15"          "y_4_asrs_16"         
[37] "y_4_asrs_17"          "y_4_asrs_18"          "y_4_mfq_1"           
[40] "y_4_mfq_2"            "y_4_mfq_3"            "y_4_mfq_4"           
[43] "y_4_mfq_5"            "y_4_mfq_6"            "y_4_mfq_7"           
[46] "y_4_mfq_8"            "y_4_mfq_9"            "y_4_mfq_10"          
[49] "y_4_mfq_11"           "y_4_mfq_12"           "y_4_mfq_13"          
[52] "academic_achievement"
d <- data[, c(1:11, 52)]
dim(d)
[1] 10870    12
names(d)
 [1] "gender"               "grade"                "snap1"               
 [4] "snap2"                "snap3"                "snap4"               
 [7] "snap5"                "snap6"                "snap7"               
[10] "snap8"                "snap9"                "academic_achievement"
str(d)
Data set with 10870 obs. of 12 variables:
 $ gender              : Nmnl. item w/ 2 labels for 0,1  num  NA NA NA NA NA NA NA NA NA NA ...
 $ grade               : Itvl. item + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap1               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap2               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap3               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap4               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap5               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap6               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap7               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap8               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ snap9               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  NA NA NA NA NA NA NA NA NA NA ...
 $ academic_achievement: Itvl. item  num  2.86 NA 3 3.67 4.1 ...
summary(d)
  gender          grade                    snap1                 snap2     
 Girl:5528   Min.    :   2.00   Not true      :2646   Not true      :2698  
 Boy :4978   1st Qu. :   2.00   Somewhat true : 350   Somewhat true : 294  
 *   :   0   Median  :   3.00   Certainly true:  61   Certainly true:  65  
 NAs : 364   Mean    :   2.84   *             :   0   *             :   0  
             3rd Qu. :   3.50   NAs           :7813   NAs           :7813  
             Max.    :   4.00                                              
             Missings:   0.00                                              
             NAs     :7719.00                                              
            snap3                 snap4                 snap5                 snap6     
 Not true      :2810   Not true      :2806   Not true      :2783   Not true      :2784  
 Somewhat true : 225   Somewhat true : 229   Somewhat true : 225   Somewhat true : 223  
 Certainly true:  23   Certainly true:  22   Certainly true:  49   Certainly true:  49  
 *             :   0   *             :   0   *             :   0   *             :   0  
 NAs           :7812   NAs           :7813   NAs           :7813   NAs           :7814  
                                                                                        
                                                                                        
                                                                                        
            snap7                 snap8                 snap9      academic_achievement
 Not true      :2927   Not true      :2260   Not true      :2733   Min.    :   1.000   
 Somewhat true :  96   Somewhat true : 669   Somewhat true : 288   1st Qu. :   3.286   
 Certainly true:  18   Certainly true: 127   Certainly true:  37   Median  :   3.889   
 *             :   0   *             :   0   *             :   0   Mean    :   3.824   
 NAs           :7829   NAs           :7814   NAs           :7812   3rd Qu. :   4.444   
                                                                   Max.    :   6.000   
                                                                   Missings:   0.000   
                                                                   NAs     :2204.000   

# Get observations of data frame that have missing values and those with complete cases
library(psych)
d.miss <- d[!complete.cases(d),]
d.nomiss <- d[complete.cases(d),]
str(d.nomiss)
Data set with 2397 obs. of 12 variables:
 $ gender              : Nmnl. item w/ 2 labels for 0,1  num  0 0 0 0 0 0 0 0 0 0 ...
 $ grade               : Itvl. item + ms.v.  num  2 2 2 2 2 2 2 2 2 2 ...
 $ snap1               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap2               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap3               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 1 0 0 0 0 0 0 0 0 ...
 $ snap4               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap5               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap6               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap7               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ snap8               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 1 0 ...
 $ snap9               : Nmnl. item w/ 3 labels for 0,1,2 + ms.v.  num  0 0 0 0 0 0 0 0 0 0 ...
 $ academic_achievement: Itvl. item  num  4.67 3.67 4.14 4.11 4.3 ...
headTail(as.data.frame(d.nomiss))
     gender grade         snap1         snap2         snap3         snap4    snap5
1      Girl     2      Not true      Not true      Not true      Not true Not true
2      Girl     2      Not true      Not true Somewhat true      Not true Not true
3      Girl     2      Not true      Not true      Not true      Not true Not true
4      Girl     2      Not true      Not true      Not true      Not true Not true
...    <NA>   ...          <NA>          <NA>          <NA>          <NA>     <NA>
2394    Boy     4 Somewhat true Somewhat true Somewhat true Somewhat true Not true
2395    Boy     4 Somewhat true      Not true      Not true      Not true Not true
2396    Boy     4 Somewhat true Somewhat true      Not true      Not true Not true
2397    Boy     4 Somewhat true      Not true      Not true      Not true Not true
             snap6         snap7         snap8         snap9 academic_achievement
1         Not true      Not true      Not true      Not true                 4.67
2         Not true      Not true      Not true      Not true                 3.67
3         Not true      Not true      Not true      Not true                 4.14
4         Not true      Not true      Not true      Not true                 4.11
...           <NA>          <NA>          <NA>          <NA>                  ...
2394 Somewhat true      Not true Somewhat true      Not true                 3.88
2395      Not true      Not true      Not true      Not true                 3.89
2396      Not true Somewhat true Somewhat true Somewhat true                 3.78
2397      Not true      Not true      Not true      Not true                 2.56
summary(d.nomiss)
  gender         grade                  snap1                 snap2     
 Girl:1256   Min.   :2.000   Not true      :2079   Not true      :2117  
 Boy :1141   1st Qu.:2.000   Somewhat true : 272   Somewhat true : 230  
             Median :3.000   Certainly true:  46   Certainly true:  50  
             Mean   :2.814                                              
             3rd Qu.:3.000                                              
             Max.   :4.000                                              
            snap3                 snap4                 snap5                 snap6     
 Not true      :2201   Not true      :2217   Not true      :2190   Not true      :2195  
 Somewhat true : 181   Somewhat true : 164   Somewhat true : 176   Somewhat true : 170  
 Certainly true:  15   Certainly true:  16   Certainly true:  31   Certainly true:  32  
                                                                                        
                                                                                        
                                                                                        
            snap7                 snap8                 snap9      academic_achievement
 Not true      :2312   Not true      :1794   Not true      :2142   Min.   :1.000       
 Somewhat true :  73   Somewhat true : 510   Somewhat true : 228   1st Qu.:3.556       
 Certainly true:  12   Certainly true:  93   Certainly true:  27   Median :4.083       
                                                                   Mean   :4.023       
                                                                   3rd Qu.:4.556       
                                                                   Max.   :5.900       
D1 <- d.nomiss   # For later use

! Make a table of SNAP1-9 distribution according to Not true, Somewhat Truer Certainly tru for boys and girls separately

summary(D1$snap1[D1$gender == "Boy"])
      Not true  Somewhat true Certainly true 
           935            176             30 
# Save the nomis D to an .csv file without row names for further analysis
D <- d.nomiss
write.csv(D, file = "../data2/inattention_nomiss_2397x12.csv",row.names=FALSE)
# For simplicity, we rename (and translate) the variables names in the dataset D without any missing
library(plyr)
d.nomiss <- read.csv(file = "../data/inattention_nomiss_2397x12.csv")
D <- d.nomiss
D <- rename(D, c(academic_achievement="ave"))
D$ave <- as.numeric(D$ave)
D$snap1 <- mapvalues(as.factor(D$snap1), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap1 <- as.numeric(D$snap1)-1
D$snap2 <- mapvalues(as.factor(D$snap2), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap2 <- as.numeric(D$snap2)-1
D$snap3 <- mapvalues(as.factor(D$snap3), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap3 <- as.numeric(D$snap3)-1
D$snap4 <- mapvalues(as.factor(D$snap4), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap4 <- as.numeric(D$snap4)-1
D$snap5 <- mapvalues(as.factor(D$snap5), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap5 <- as.numeric(D$snap5)-1
D$snap6 <- mapvalues(as.factor(D$snap6), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap6 <- as.numeric(D$snap6)-1
D$snap7 <- mapvalues(as.factor(D$snap7), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap7 <- as.numeric(D$snap7)-1
D$snap8 <- mapvalues(as.factor(D$snap8), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap8 <- as.numeric(D$snap8)-1
D$snap9 <- mapvalues(as.factor(D$snap9), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","2"))
D$snap9 <- as.numeric(D$snap9)-1
D$gender <- mapvalues(as.factor(D$gender), from = c("Girl", "Boy"), to = c("0", "1"))
D$gender <- as.numeric(D$gender)-1
D$grade <- as.numeric(D$grade)
str(D)
'data.frame':   2397 obs. of  12 variables:
 $ gender: num  1 1 1 1 1 1 1 1 1 1 ...
 $ grade : num  2 2 2 2 2 2 2 2 2 2 ...
 $ snap1 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap2 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap3 : num  1 2 1 1 1 1 1 1 1 1 ...
 $ snap4 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap5 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap6 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap7 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap8 : num  1 1 1 1 1 1 1 1 2 1 ...
 $ snap9 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ ave   : num  4.67 3.67 4.14 4.11 4.3 ...
headTail(D)
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9  ave
1         1     2     1     1     1     1     1     1     1     1     1 4.67
2         1     2     1     1     2     1     1     1     1     1     1 3.67
3         1     2     1     1     1     1     1     1     1     1     1 4.14
4         1     2     1     1     1     1     1     1     1     1     1 4.11
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...  ...
2394      0     4     2     2     2     2     1     2     1     2     1 3.88
2395      0     4     2     1     1     1     1     1     1     1     1 3.89
2396      0     4     2     2     1     1     1     1     2     2     2 3.78
2397      0     4     2     1     1     1     1     1     1     1     1 2.56
D3 <- D   # For later use
# Save D (at early stage) to an .csv file for later analysis in R or MATLAB 
write.csv(D, file = "../data/inattention_nomiss_2397x12_snap_is_0_1_2.csv",row.names=FALSE)
# For even more simplicity, we rename (and translate) the variables names in the dataset 
# without any missing, reducing the predictor categories to be binary, 
# i.e. collapsing SNAP values "1" and "2" to "1":
library(plyr)
D <- d.nomiss
D <- rename(D, c(academic_achievement="ave"))
D$ave <- as.numeric(D$ave)
D$snap1 <- mapvalues(as.factor(D$snap1), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap1 <- as.numeric(D$snap1)-1
D$snap2 <- mapvalues(as.factor(D$snap2), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap2 <- as.numeric(D$snap2)-1
D$snap3 <- mapvalues(as.factor(D$snap3), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap3 <- as.numeric(D$snap3)-1
D$snap4 <- mapvalues(as.factor(D$snap4), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap4 <- as.numeric(D$snap4)-1
D$snap5 <- mapvalues(as.factor(D$snap5), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap5 <- as.numeric(D$snap5)-1
D$snap6 <- mapvalues(as.factor(D$snap6), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap6 <- as.numeric(D$snap6)-1
D$snap7 <- mapvalues(as.factor(D$snap7), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap7 <- as.numeric(D$snap7)-1
D$snap8 <- mapvalues(as.factor(D$snap8), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap8 <- as.numeric(D$snap8)-1
D$snap9 <- mapvalues(as.factor(D$snap9), from = c("Not true","Somewhat true","Certainly true"), to = c("0","1","1"))
D$snap9 <- as.numeric(D$snap9)-1
D$gender <- mapvalues(as.factor(D$gender), from = c("Girl", "Boy"), to = c("0", "1"))
D$gender <- as.numeric(D$gender)-1
D$grade <- as.numeric(D$grade)
str(D)
'data.frame':   2397 obs. of  12 variables:
 $ gender: num  1 1 1 1 1 1 1 1 1 1 ...
 $ grade : num  2 2 2 2 2 2 2 2 2 2 ...
 $ snap1 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap2 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap3 : num  1 0 1 1 1 1 1 1 1 1 ...
 $ snap4 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap5 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap6 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap7 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap8 : num  1 1 1 1 1 1 1 1 0 1 ...
 $ snap9 : num  1 1 1 1 1 1 1 1 1 1 ...
 $ ave   : num  4.67 3.67 4.14 4.11 4.3 ...
headTail(D)
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9  ave
1         1     2     1     1     1     1     1     1     1     1     1 4.67
2         1     2     1     1     0     1     1     1     1     1     1 3.67
3         1     2     1     1     1     1     1     1     1     1     1 4.14
4         1     2     1     1     1     1     1     1     1     1     1 4.11
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...  ...
2394      0     4     0     0     0     0     1     0     1     0     1 3.88
2395      0     4     0     1     1     1     1     1     1     1     1 3.89
2396      0     4     0     0     1     1     1     1     0     0     0 3.78
2397      0     4     0     1     1     1     1     1     1     1     1 2.56
D2 <- D  # For later use
# Save the new D to an .csv file without row names for further analysis
write.csv(D, file = "../data/inattention_nomiss_2397x12_snap_is_0_1.csv",row.names=FALSE)

Struture of the D dataset

D <- D3
s <- dim(D)
n <- s[1]
p <- s[2]
txt = sprintf("Structure of the %d x %d DATASET", n, p)
print(txt)
[1] "Structure of the 2397 x 12 DATASET"
library(DiagrammeR)
n_txt = sprintf("Dataset \n (N = %d)", n);
gviz <- grViz("
              # Circles: predictor variables; Triangle: Outcome variable
              digraph Structure_of_the_dataset_D {
              # node definitions with substituted label text
              node [fontname = Helvetica]
              1 [label = 'Dataset \n (N = 2397)', shape=box]
              2 [label = 'gender \n {Girl (0) | Boy (1)}', shape=circle]
              3 [label = 'grade \n {2 | 3 | 4}', shape=circle]
              4 [label = 'ave \n (average marks) \n [1, 6] or {low (L) | medium (M) | high (H)}', shape=triangle]
              a [label = 'SNAP \n {0 | 1 | 2}', shape=oval]
              b [label = 'SNAP1', shape=circle]
              c [label = 'SNAP2', shape=circle]
              d [label = 'SNAP3', shape=circle]
              e [label = 'SNAP4', shape=circle]
              f [label = 'SNAP5', shape=circle]
              g [label = 'SNAP6', shape=circle]
              h [label = 'SNAP7', shape=circle]
              i [label = 'SNAP8', shape=circle]
              j [label = 'SNAP9', shape=circle]
              # edge definitions with the node IDs
              1 -> {2 3 a 4}
              a -> {b c d e f g h i j}
              }",
engine = "dot")
print(gviz)
NULL
# This does not work using DiagrammeR / GraphViz
# png("../manuscript/Figs/graph_design.png")
# print(gviz)
# dev.off()
# Uses Viewer, Zoom and Screen capture to produce .png and then
# data_prep_structure_grviz_20160203.pdf file

The dataset that will be analyzed and reported

In our analysis we included n = 2397 individuals (none with missing data) from the dataset “/Users/arvid/Dropbox/Arvid_inattention/data2/inattention_Arvid_new.sav”.

D <- D3
n_txt = sprintf("In our analysis we included n = %d individuals (none with missing data) from the dataset '%s'\n", nrow(D), fn);
print(n_txt)
[1] "In our analysis we included n = 2397 individuals (none with missing data) from the dataset '/Users/arvid/Dropbox/Arvid_inattention/data2/inattention_Arvid_new.sav'\n"

Grades (continuous and categorized)

We consider the grades (academic_achievement), as both a continuous (for regression) and discretized variable (for classification), where gjennomsnitt: - Item ‘Karaktergjennomsnitt alle gyldige karakterer 1-6 (ikke kroppsøving)’

# Discretized at three levels, with data-driven cutpoints (equifrequent levels)
D <- D3
aver <- D$ave
summary(aver)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   3.556   4.083   4.023   4.556   5.900 
bins <- 3
cutpoints<-quantile(aver,(0:bins)/bins,names=FALSE)
print(cutpoints)
[1] 1.000000 3.750000 4.428571 5.900000
# Consistent with MATLAB 'histcounts' (D_20151110_analysis.m  ;  T2)
# fn2 = '../data/D_20151110.csv';
# T2 = readtable(fn2);
# bins = 3;
# y = quantile(T2.ave,[0:bins]/bins)
# [N,EDGES,BIN] = histcounts(T2.ave,y);
# cuts = sprintf('1:[%.2f, %.2f) 2:[%.2f,%.2f) 3:[%.2f,%.2f]', EDGES(1), EDGES(2), EDGES(2), EDGES(3), EDGES(3), EDGES(4));
# T2.ave_cat = BIN;   % categorical(BIN,'Ordinal',true);
# descr = sprintf('%s - 1:low, 2:medium; 3:high average mark', cuts);
# T2.Properties.VariableDescriptions{'ave_cat'} = descr;
# => descr = 1:[1.00, 3.75) 2:[3.75,4.43) 3:[4.43,5.90] - 1:low, 2:medium; 3:high average mark
averBinned <- cut(aver, cutpoints, right=FALSE, include.lowest=TRUE)
summary(averBinned)
   [1,3.75) [3.75,4.43)  [4.43,5.9] 
        779         818         800 

Make histogram of dicretized ‘averBinned’:

hist(as.numeric(averBinned))

Define grade categories “low”, “medium” and “high” in terms of the calculated cut-point intervals:

txt_low <- sprintf("low (L): [%.3f, %.3f)\n", cutpoints[[1]], cutpoints[[2]])
print(txt_low)
[1] "low (L): [1.000, 3.750)\n"
txt_medium <- sprintf("medium (M): [%.3f, %.3f)\n", cutpoints[[2]], cutpoints[[3]])
print(txt_medium)
[1] "medium (M): [3.750, 4.429)\n"
txt_high <- sprintf("high H): [%.3f, %.3f]\n", cutpoints[[3]], cutpoints[[4]])
print(txt_high)
[1] "high H): [4.429, 5.900]\n"
library(psych)
# Dataset for classification based on D3 and discretized average academic achievemnt
C <- D3
C$averBinned <- cut(aver, cutpoints, right=FALSE, include.lowest=TRUE,
                     labels=c("L","M","H"))
C <- subset(C, select = -c(ave))
str(C)
'data.frame':   2397 obs. of  12 variables:
 $ gender    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ grade     : num  2 2 2 2 2 2 2 2 2 2 ...
 $ snap1     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap2     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap3     : num  1 2 1 1 1 1 1 1 1 1 ...
 $ snap4     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap5     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap6     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap7     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap8     : num  1 1 1 1 1 1 1 1 2 1 ...
 $ snap9     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ averBinned: Factor w/ 3 levels "L","M","H": 3 1 2 2 2 2 1 2 3 2 ...
headTail(as.data.frame(C))
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9 averBinned
1         1     2     1     1     1     1     1     1     1     1     1          H
2         1     2     1     1     2     1     1     1     1     1     1          L
3         1     2     1     1     1     1     1     1     1     1     1          M
4         1     2     1     1     1     1     1     1     1     1     1          M
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...       <NA>
2394      0     4     2     2     2     2     1     2     1     2     1          M
2395      0     4     2     1     1     1     1     1     1     1     1          M
2396      0     4     2     2     1     1     1     1     2     2     2          M
2397      0     4     2     1     1     1     1     1     1     1     1          L
headTail(as.data.frame(D3))
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9  ave
1         1     2     1     1     1     1     1     1     1     1     1 4.67
2         1     2     1     1     2     1     1     1     1     1     1 3.67
3         1     2     1     1     1     1     1     1     1     1     1 4.14
4         1     2     1     1     1     1     1     1     1     1     1 4.11
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...  ...
2394      0     4     2     2     2     2     1     2     1     2     1 3.88
2395      0     4     2     1     1     1     1     1     1     1     1 3.89
2396      0     4     2     2     1     1     1     1     2     2     2 3.78
2397      0     4     2     1     1     1     1     1     1     1     1 2.56
# Save the dataset C with binary SNAP predictors and trinary outcome to an .csv file 
# for further analysis
write.csv(C, file = "../data/inattention_nomiss_2397x12_snap_is_0_1_2_outcome_is_L_M_H.csv",row.names=FALSE)
# Dataset for classification based on D3 and discretized average academic achievemnt
E <- D3
E$averBinned <- cut(aver, cutpoints, right=FALSE, include.lowest=TRUE,
                     labels=c("0","1","2"))
E <- subset(E, select = -c(ave))
str(E)
'data.frame':   2397 obs. of  12 variables:
 $ gender    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ grade     : num  2 2 2 2 2 2 2 2 2 2 ...
 $ snap1     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap2     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap3     : num  1 2 1 1 1 1 1 1 1 1 ...
 $ snap4     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap5     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap6     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap7     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ snap8     : num  1 1 1 1 1 1 1 1 2 1 ...
 $ snap9     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ averBinned: Factor w/ 3 levels "0","1","2": 3 1 2 2 2 2 1 2 3 2 ...
summary(E)
     gender          grade           snap1           snap2           snap3      
 Min.   :0.000   Min.   :2.000   Min.   :0.000   Min.   :0.000   Min.   :0.000  
 1st Qu.:0.000   1st Qu.:2.000   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
 Median :1.000   Median :3.000   Median :1.000   Median :1.000   Median :1.000  
 Mean   :0.524   Mean   :2.814   Mean   :1.094   Mean   :1.075   Mean   :1.069  
 3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:1.000   3rd Qu.:1.000   3rd Qu.:1.000  
 Max.   :1.000   Max.   :4.000   Max.   :2.000   Max.   :2.000   Max.   :2.000  
     snap4           snap5          snap6           snap7           snap8      
 Min.   :0.000   Min.   :0.00   Min.   :0.000   Min.   :0.000   Min.   :0.000  
 1st Qu.:1.000   1st Qu.:1.00   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:1.000  
 Median :1.000   Median :1.00   Median :1.000   Median :1.000   Median :1.000  
 Mean   :1.062   Mean   :1.06   Mean   :1.058   Mean   :1.025   Mean   :1.174  
 3rd Qu.:1.000   3rd Qu.:1.00   3rd Qu.:1.000   3rd Qu.:1.000   3rd Qu.:1.000  
 Max.   :2.000   Max.   :2.00   Max.   :2.000   Max.   :2.000   Max.   :2.000  
     snap9       averBinned
 Min.   :0.000   0:779     
 1st Qu.:1.000   1:818     
 Median :1.000   2:800     
 Mean   :1.084             
 3rd Qu.:1.000             
 Max.   :2.000             
headTail(as.data.frame(E))
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9 averBinned
1         1     2     1     1     1     1     1     1     1     1     1          2
2         1     2     1     1     2     1     1     1     1     1     1          0
3         1     2     1     1     1     1     1     1     1     1     1          1
4         1     2     1     1     1     1     1     1     1     1     1          1
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...       <NA>
2394      0     4     2     2     2     2     1     2     1     2     1          1
2395      0     4     2     1     1     1     1     1     1     1     1          1
2396      0     4     2     2     1     1     1     1     2     2     2          1
2397      0     4     2     1     1     1     1     1     1     1     1          0
headTail(as.data.frame(D3))
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9  ave
1         1     2     1     1     1     1     1     1     1     1     1 4.67
2         1     2     1     1     2     1     1     1     1     1     1 3.67
3         1     2     1     1     1     1     1     1     1     1     1 4.14
4         1     2     1     1     1     1     1     1     1     1     1 4.11
...     ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...  ...
2394      0     4     2     2     2     2     1     2     1     2     1 3.88
2395      0     4     2     1     1     1     1     1     1     1     1 3.89
2396      0     4     2     2     1     1     1     1     2     2     2 3.78
2397      0     4     2     1     1     1     1     1     1     1     1 2.56
# Save the dataset E with numerical SNAP predictors and trinary outcome to an .csv file 
# for further analysis
write.csv(E, file = "../data/inattention_nomiss_2397x12_snap_is_0_1_2_outcome_is_0_1_2.csv",row.names=FALSE)

Converting numerical variables to factors

library(xtable)
C <- as.data.frame(C)
# select columns
cols <- c("gender", "grade", "snap1", "snap2", "snap3", "snap4", "snap5", "snap6", "snap7", "snap8", "snap9", "averBinned")
C[,cols] <- data.frame(apply(C[cols], 2, as.factor))
levels(C$gender) <- c("G", "B")
levels(C$grade) <- c("2nd", "3rd", "4th")
# N - not true (0)
# S - somewhat true (1)
# C - certainly true (2)
levels(C$snap1) <- c("N", "S", "C")  
levels(C$snap2) <- c("N", "S", "C")  
levels(C$snap3) <- c("N", "S", "C")  
levels(C$snap4) <- c("N", "S", "C")  
levels(C$snap5) <- c("N", "S", "C")  
levels(C$snap6) <- c("N", "S", "C")  
levels(C$snap7) <- c("N", "S", "C")  
levels(C$snap8) <- c("N", "S", "C")  
levels(C$snap9) <- c("N", "S", "C")
levels(C$averBinned) <- c("H", "L", "M")    # numerical order = alphabetical order
str(C)
'data.frame':   2397 obs. of  12 variables:
 $ gender    : Factor w/ 2 levels "G","B": 2 2 2 2 2 2 2 2 2 2 ...
 $ grade     : Factor w/ 3 levels "2nd","3rd","4th": 1 1 1 1 1 1 1 1 1 1 ...
 $ snap1     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap2     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap3     : Factor w/ 3 levels "N","S","C": 2 3 2 2 2 2 2 2 2 2 ...
 $ snap4     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap5     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap6     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap7     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ snap8     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 3 2 ...
 $ snap9     : Factor w/ 3 levels "N","S","C": 2 2 2 2 2 2 2 2 2 2 ...
 $ averBinned: Factor w/ 3 levels "H","L","M": 1 2 3 3 3 3 2 3 1 3 ...
headTail(C)
     gender grade snap1 snap2 snap3 snap4 snap5 snap6 snap7 snap8 snap9 averBinned
1         B   2nd     S     S     S     S     S     S     S     S     S          H
2         B   2nd     S     S     C     S     S     S     S     S     S          L
3         B   2nd     S     S     S     S     S     S     S     S     S          M
4         B   2nd     S     S     S     S     S     S     S     S     S          M
...    <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>  <NA>       <NA>
2394      G   4th     C     C     C     C     S     C     S     C     S          M
2395      G   4th     C     S     S     S     S     S     S     S     S          M
2396      G   4th     C     C     S     S     S     S     C     C     C          M
2397      G   4th     C     S     S     S     S     S     S     S     S          L
summary(C)
 gender   grade      snap1    snap2    snap3    snap4    snap5    snap6    snap7    snap8   
 G:1141   2nd:1008   N:  46   N:  50   N:  15   N:  16   N:  31   N:  32   N:  12   N:  93  
 B:1256   3rd: 827   S:2079   S:2117   S:2201   S:2217   S:2190   S:2195   S:2312   S:1794  
          4th: 562   C: 272   C: 230   C: 181   C: 164   C: 176   C: 170   C:  73   C: 510  
 snap9    averBinned
 N:  27   H:800     
 S:2142   L:779     
 C: 228   M:818     
xtable(summary(C))
% latex table generated in R 3.3.1 by xtable 1.8-2 package
% Fri Aug 19 22:46:38 2016
\begin{table}[ht]
\centering
\begin{tabular}{rllllllllllll}
  \hline
 & gender & grade & snap1 & snap2 & snap3 & snap4 & snap5 & snap6 & snap7 & snap8 & snap9 & averBinned \\ 
  \hline
1 & G:1141   & 2nd:1008   & N:  46   & N:  50   & N:  15   & N:  16   & N:  31   & N:  32   & N:  12   & N:  93   & N:  27   & H:800   \\ 
  2 & B:1256   & 3rd: 827   & S:2079   & S:2117   & S:2201   & S:2217   & S:2190   & S:2195   & S:2312   & S:1794   & S:2142   & L:779   \\ 
  3 &  & 4th: 562   & C: 272   & C: 230   & C: 181   & C: 164   & C: 176   & C: 170   & C:  73   & C: 510   & C: 228   & M:818   \\ 
   \hline
\end{tabular}
\end{table}
# Save the dataset C with SNAP predictors as factors and trinary outcome to an .csv file 
# for further analysis
write.csv(C, file = "../data/inattention_nomiss_2397x12_snap_is_N_S_C_outcome_is_L_M_H.csv",row.names=FALSE)
library(Hmisc)
describe(C)
C 

 12  Variables      2397  Observations
----------------------------------------------------------------------------------------------
gender 
      n missing  unique 
   2397       0       2 

G (1141, 48%), B (1256, 52%) 
----------------------------------------------------------------------------------------------
grade 
      n missing  unique 
   2397       0       3 

2nd (1008, 42%), 3rd (827, 35%), 4th (562, 23%) 
----------------------------------------------------------------------------------------------
snap1 
      n missing  unique 
   2397       0       3 

N (46, 2%), S (2079, 87%), C (272, 11%) 
----------------------------------------------------------------------------------------------
snap2 
      n missing  unique 
   2397       0       3 

N (50, 2%), S (2117, 88%), C (230, 10%) 
----------------------------------------------------------------------------------------------
snap3 
      n missing  unique 
   2397       0       3 

N (15, 1%), S (2201, 92%), C (181, 8%) 
----------------------------------------------------------------------------------------------
snap4 
      n missing  unique 
   2397       0       3 

N (16, 1%), S (2217, 92%), C (164, 7%) 
----------------------------------------------------------------------------------------------
snap5 
      n missing  unique 
   2397       0       3 

N (31, 1%), S (2190, 91%), C (176, 7%) 
----------------------------------------------------------------------------------------------
snap6 
      n missing  unique 
   2397       0       3 

N (32, 1%), S (2195, 92%), C (170, 7%) 
----------------------------------------------------------------------------------------------
snap7 
      n missing  unique 
   2397       0       3 

N (12, 1%), S (2312, 96%), C (73, 3%) 
----------------------------------------------------------------------------------------------
snap8 
      n missing  unique 
   2397       0       3 

N (93, 4%), S (1794, 75%), C (510, 21%) 
----------------------------------------------------------------------------------------------
snap9 
      n missing  unique 
   2397       0       3 

N (27, 1%), S (2142, 89%), C (228, 10%) 
----------------------------------------------------------------------------------------------
averBinned 
      n missing  unique 
   2397       0       3 

H (800, 33%), L (779, 32%), M (818, 34%) 
----------------------------------------------------------------------------------------------
library(pander)
panderOptions("digits", 5)
pander(summary(C))

-------------------------------------------------------------------------
 gender   grade    snap1   snap2   snap3   snap4   snap5   snap6   snap7 
-------- -------- ------- ------- ------- ------- ------- ------- -------
 G:1141  2nd:1008  N: 46   N: 50   N: 15   N: 16   N: 31   N: 32   N: 12 

 B:1256  3rd: 827 S:2079  S:2117  S:2201  S:2217  S:2190  S:2195  S:2312 

   NA    4th: 562 C: 272  C: 230  C: 181  C: 164  C: 176  C: 170   C: 73 
-------------------------------------------------------------------------

Table: Table continues below

 
----------------------------
 snap8   snap9   averBinned 
------- ------- ------------
 N: 93   N: 27     H:800    

S:1794  S:2142     L:779    

C: 510  C: 228     M:818    
----------------------------
pander(summary(E))

---------------------------------------------------------------------
   gender         grade         snap1         snap2         snap3    
------------- ------------- ------------- ------------- -------------
Min.  :0.000  Min.  :2.000  Min.  :0.000  Min.  :0.000  Min.  :0.000 

1st Qu.:0.000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000

Median :1.000 Median :3.000 Median :1.000 Median :1.000 Median :1.000

 Mean :0.524   Mean :2.814   Mean :1.094   Mean :1.075   Mean :1.069 

3rd Qu.:1.000 3rd Qu.:3.000 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.000

Max.  :1.000  Max.  :4.000  Max.  :2.000  Max.  :2.000  Max.  :2.000 
---------------------------------------------------------------------

Table: Table continues below

 
--------------------------------------------------------------------
    snap4        snap5         snap6         snap7         snap8    
------------- ------------ ------------- ------------- -------------
Min.  :0.000  Min.  :0.00  Min.  :0.000  Min.  :0.000  Min.  :0.000 

1st Qu.:1.000 1st Qu.:1.00 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000

Median :1.000 Median :1.00 Median :1.000 Median :1.000 Median :1.000

 Mean :1.062   Mean :1.06   Mean :1.058   Mean :1.025   Mean :1.174 

3rd Qu.:1.000 3rd Qu.:1.00 3rd Qu.:1.000 3rd Qu.:1.000 3rd Qu.:1.000

Max.  :2.000  Max.  :2.00  Max.  :2.000  Max.  :2.000  Max.  :2.000 
--------------------------------------------------------------------

Table: Table continues below

 
--------------------------
    snap9      averBinned 
------------- ------------
Min.  :0.000     0:779    

1st Qu.:1.000    1:818    

Median :1.000    2:800    

 Mean :1.084       NA     

3rd Qu.:1.000      NA     

Max.  :2.000       NA     
--------------------------

Describe subsets of data according to academic achievement and gender

C.girls.L <- C[ which(C$gender=='G' & C$averBinned=='L'), ]
C.girls.H <- C[ which(C$gender=='G' & C$averBinned=='H'), ]
C.boys.L <- C[ which(C$gender=='B' & C$averBinned=='L'), ]
C.boys.H <- C[ which(C$gender=='B' & C$averBinned=='H'), ]
summary(C.girls.L)
 gender  grade     snap1   snap2   snap3   snap4   snap5   snap6   snap7   snap8   snap9  
 G:447   2nd:183   N: 23   N: 33   N:  9   N:  9   N: 17   N: 16   N:  5   N: 48   N: 14  
 B:  0   3rd:163   S:328   S:313   S:361   S:365   S:353   S:351   S:406   S:226   S:355  
         4th:101   C: 96   C:101   C: 77   C: 73   C: 77   C: 80   C: 36   C:173   C: 78  
 averBinned
 H:  0     
 L:447     
 M:  0     
summary(C.girls.H)
 gender  grade     snap1   snap2   snap3   snap4   snap5   snap6   snap7   snap8   snap9  
 G:305   2nd:118   N:  1   N:  3   N:  0   N:  0   N:  5   N:  2   N:  0   N:  7   N:  2  
 B:  0   3rd:105   S:282   S:286   S:284   S:289   S:284   S:289   S:300   S:245   S:281  
         4th: 82   C: 22   C: 16   C: 21   C: 16   C: 16   C: 14   C:  5   C: 53   C: 22  
 averBinned
 H:305     
 L:  0     
 M:  0     
summary(C.boys.L)
 gender  grade     snap1   snap2   snap3   snap4   snap5   snap6   snap7   snap8   snap9  
 G:  0   2nd:128   N:  6   N:  3   N:  1   N:  0   N:  3   N:  3   N:  3   N: 12   N:  2  
 B:332   3rd:100   S:284   S:284   S:311   S:304   S:303   S:299   S:321   S:245   S:295  
         4th:104   C: 42   C: 45   C: 20   C: 28   C: 26   C: 30   C:  8   C: 75   C: 35  
 averBinned
 H:  0     
 L:332     
 M:  0     
summary(C.boys.H)
 gender  grade     snap1   snap2   snap3   snap4   snap5   snap6   snap7   snap8   snap9  
 G:  0   2nd:232   N:  2   N:  0   N:  0   N:  0   N:  0   N:  0   N:  0   N:  1   N:  1  
 B:495   3rd:146   S:474   S:488   S:486   S:491   S:489   S:493   S:493   S:450   S:476  
         4th:117   C: 19   C:  7   C:  9   C:  4   C:  6   C:  2   C:  2   C: 44   C: 18  
 averBinned
 H:495     
 L:  0     
 M:  0     
library(Hmisc)
describe(C.girls.L)
C.girls.L 

 12  Variables      447  Observations
----------------------------------------------------------------------------------------------
gender 
      n missing  unique   value 
    447       0       1       G 
----------------------------------------------------------------------------------------------
grade 
      n missing  unique 
    447       0       3 

2nd (183, 41%), 3rd (163, 36%), 4th (101, 23%) 
----------------------------------------------------------------------------------------------
snap1 
      n missing  unique 
    447       0       3 

N (23, 5%), S (328, 73%), C (96, 21%) 
----------------------------------------------------------------------------------------------
snap2 
      n missing  unique 
    447       0       3 

N (33, 7%), S (313, 70%), C (101, 23%) 
----------------------------------------------------------------------------------------------
snap3 
      n missing  unique 
    447       0       3 

N (9, 2%), S (361, 81%), C (77, 17%) 
----------------------------------------------------------------------------------------------
snap4 
      n missing  unique 
    447       0       3 

N (9, 2%), S (365, 82%), C (73, 16%) 
----------------------------------------------------------------------------------------------
snap5 
      n missing  unique 
    447       0       3 

N (17, 4%), S (353, 79%), C (77, 17%) 
----------------------------------------------------------------------------------------------
snap6 
      n missing  unique 
    447       0       3 

N (16, 4%), S (351, 79%), C (80, 18%) 
----------------------------------------------------------------------------------------------
snap7 
      n missing  unique 
    447       0       3 

N (5, 1%), S (406, 91%), C (36, 8%) 
----------------------------------------------------------------------------------------------
snap8 
      n missing  unique 
    447       0       3 

N (48, 11%), S (226, 51%), C (173, 39%) 
----------------------------------------------------------------------------------------------
snap9 
      n missing  unique 
    447       0       3 

N (14, 3%), S (355, 79%), C (78, 17%) 
----------------------------------------------------------------------------------------------
averBinned 
      n missing  unique   value 
    447       0       1       L 
----------------------------------------------------------------------------------------------
describe(C.girls.H)
C.girls.H 

 12  Variables      305  Observations
----------------------------------------------------------------------------------------------
gender 
      n missing  unique   value 
    305       0       1       G 
----------------------------------------------------------------------------------------------
grade 
      n missing  unique 
    305       0       3 

2nd (118, 39%), 3rd (105, 34%), 4th (82, 27%) 
----------------------------------------------------------------------------------------------
snap1 
      n missing  unique 
    305       0       3 

N (1, 0%), S (282, 92%), C (22, 7%) 
----------------------------------------------------------------------------------------------
snap2 
      n missing  unique 
    305       0       3 

N (3, 1%), S (286, 94%), C (16, 5%) 
----------------------------------------------------------------------------------------------
snap3 
      n missing  unique 
    305       0       2 

S (284, 93%), C (21, 7%) 
----------------------------------------------------------------------------------------------
snap4 
      n missing  unique 
    305       0       2 

S (289, 95%), C (16, 5%) 
----------------------------------------------------------------------------------------------
snap5 
      n missing  unique 
    305       0       3 

N (5, 2%), S (284, 93%), C (16, 5%) 
----------------------------------------------------------------------------------------------
snap6 
      n missing  unique 
    305       0       3 

N (2, 1%), S (289, 95%), C (14, 5%) 
----------------------------------------------------------------------------------------------
snap7 
      n missing  unique 
    305       0       2 

S (300, 98%), C (5, 2%) 
----------------------------------------------------------------------------------------------
snap8 
      n missing  unique 
    305       0       3 

N (7, 2%), S (245, 80%), C (53, 17%) 
----------------------------------------------------------------------------------------------
snap9 
      n missing  unique 
    305       0       3 

N (2, 1%), S (281, 92%), C (22, 7%) 
----------------------------------------------------------------------------------------------
averBinned 
      n missing  unique   value 
    305       0       1       H 
----------------------------------------------------------------------------------------------
describe(C.boys.L)
C.boys.L 

 12  Variables      332  Observations
----------------------------------------------------------------------------------------------
gender 
      n missing  unique   value 
    332       0       1       B 
----------------------------------------------------------------------------------------------
grade 
      n missing  unique 
    332       0       3 

2nd (128, 39%), 3rd (100, 30%), 4th (104, 31%) 
----------------------------------------------------------------------------------------------
snap1 
      n missing  unique 
    332       0       3 

N (6, 2%), S (284, 86%), C (42, 13%) 
----------------------------------------------------------------------------------------------
snap2 
      n missing  unique 
    332       0       3 

N (3, 1%), S (284, 86%), C (45, 14%) 
----------------------------------------------------------------------------------------------
snap3 
      n missing  unique 
    332       0       3 

N (1, 0%), S (311, 94%), C (20, 6%) 
----------------------------------------------------------------------------------------------
snap4 
      n missing  unique 
    332       0       2 

S (304, 92%), C (28, 8%) 
----------------------------------------------------------------------------------------------
snap5 
      n missing  unique 
    332       0       3 

N (3, 1%), S (303, 91%), C (26, 8%) 
----------------------------------------------------------------------------------------------
snap6 
      n missing  unique 
    332       0       3 

N (3, 1%), S (299, 90%), C (30, 9%) 
----------------------------------------------------------------------------------------------
snap7 
      n missing  unique 
    332       0       3 

N (3, 1%), S (321, 97%), C (8, 2%) 
----------------------------------------------------------------------------------------------
snap8 
      n missing  unique 
    332       0       3 

N (12, 4%), S (245, 74%), C (75, 23%) 
----------------------------------------------------------------------------------------------
snap9 
      n missing  unique 
    332       0       3 

N (2, 1%), S (295, 89%), C (35, 11%) 
----------------------------------------------------------------------------------------------
averBinned 
      n missing  unique   value 
    332       0       1       L 
----------------------------------------------------------------------------------------------
describe(C.boys.H)
C.boys.H 

 12  Variables      495  Observations
----------------------------------------------------------------------------------------------
gender 
      n missing  unique   value 
    495       0       1       B 
----------------------------------------------------------------------------------------------
grade 
      n missing  unique 
    495       0       3 

2nd (232, 47%), 3rd (146, 29%), 4th (117, 24%) 
----------------------------------------------------------------------------------------------
snap1 
      n missing  unique 
    495       0       3 

N (2, 0%), S (474, 96%), C (19, 4%) 
----------------------------------------------------------------------------------------------
snap2 
      n missing  unique 
    495       0       2 

S (488, 99%), C (7, 1%) 
----------------------------------------------------------------------------------------------
snap3 
      n missing  unique 
    495       0       2 

S (486, 98%), C (9, 2%) 
----------------------------------------------------------------------------------------------
snap4 
      n missing  unique 
    495       0       2 

S (491, 99%), C (4, 1%) 
----------------------------------------------------------------------------------------------
snap5 
      n missing  unique 
    495       0       2 

S (489, 99%), C (6, 1%) 
----------------------------------------------------------------------------------------------
snap6 
      n missing  unique 
    495       0       2 

S (493, 100%), C (2, 0%) 
----------------------------------------------------------------------------------------------
snap7 
      n missing  unique 
    495       0       2 

S (493, 100%), C (2, 0%) 
----------------------------------------------------------------------------------------------
snap8 
      n missing  unique 
    495       0       3 

N (1, 0%), S (450, 91%), C (44, 9%) 
----------------------------------------------------------------------------------------------
snap9 
      n missing  unique 
    495       0       3 

N (1, 0%), S (476, 96%), C (18, 4%) 
----------------------------------------------------------------------------------------------
averBinned 
      n missing  unique   value 
    495       0       1       H 
----------------------------------------------------------------------------------------------
LS0tCnRpdGxlOiAiUHJlZGljdGlvbiBvZiBhY2FkZW1pYyBhY2hpZXZlbWVudCBpbiBhZG9sZXNjZW50cyBmcm9tIHRlYWNoZXIgcmVwb3J0cyBvZiBpbmF0dGVudGlvbiBpbiBjaGlsZGhvb2QgLSBhIG1ldGhvZG9sb2dpY2FsIHBhdHRlcm4gY2xhc3NpZmljYXRpb24gc3R1ZHkiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9Cn5HaXRIdWIvaW5hdHRlbnRpb24tcG9wdWxhdGlvbnNhbXBsZS9jb2RlL2luYXR0ZW50aW9uLXBvcHVsYXRpb25zYW1wbGUtZGF0YS1wcmVwLlJtZApgYGAKPHNtYWxsPgpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIApBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KPC9zbWFsbD4KCgojIyBBYnN0cmFjdAoKIyMjIEJhY2tncm91bmQKSW5hdHRlbnRpdmUgYmVoYXZpb3IgaXMgYXNzb2NpYXRlZCB3aXRoIGFjYWRlbWljIHByb2JsZW1zLiBUaGUgcHJlc2VudCBzdHVkeSBpbnZlc3RpZ2F0ZXMgcHJpbWFyeSBzY2hvb2wgdGVhY2hlciByZXBvcnRzIG9uIG5pbmUgaXRlbXMgcmVmbGVjdGluZyBkaWZmZXJlbnQgYXNwZWN0cyBvZiBpbmF0dGVudGlvbiwgd2l0aCBhbiBhaW0gdG8gcmV2ZWFsIHBhdHRlcm5zIG9mIGJlaGF2aW9yIHByZWRpY3RpbmcgaGlnaC1zY2hvb2wgYWNhZGVtaWMgYWNoaWV2ZW1lbnQuIFRvIHRoYXQgZW5kLCB3ZSB1c2VkIGRpZmZlcmVudCB0eXBlcyBvZiBwYXR0ZXJuIGFuYWx5c2lzIGFuZCBtYWNoaW5lIGxlYXJuaW5nIG1ldGhvZHMuIAoKIyMjIE1ldGhvZHMKSW5hdHRlbnRpb24gaW4gYSBzYW1wbGUgMjM5NyBpbmRpdmlkdWFscyB3ZXJlIHJhdGVkIGJ5IHRoZWlyIHByaW1hcnkgc2Nob29sIHRlYWNoZXJzIHdoZW4gdGhleSBwYXJ0aWNpcGF0ZWQgaW4gdGhlIGZpcnN0IHdhdmUgb2YgdGhlIEJlcmdlbiBDaGlsZCBTdHVkeSAoQkNTKSAoNyAtIDkgeWVhcnMgb2xkKSwgYW5kIHRoZWlyIGFjYWRlbWljIGFjaGlldmVtZW50cyB3ZXJlIGF2YWlsYWJsZSBmcm9tIGFuIG9mZmljaWFsIHNjaG9vbCByZWdpc3RlciB3aGVuIGF0dGVuZGluZyBoaWdoLXNjaG9vbCAoMTYgLSAxOSB5ZWFycyBvbGQpLiBJbmF0dGVudGlvbiB3YXMgYXNzZXNzZWQgYnkgdGhlIG5pbmUgaXRlbXMgcmF0ZWQgYXQgYSBjYXRlZ29yaWNhbCBsZXZlLCBhbmQgdGhlIGFjYWRlbWljIGFjaGlldmVtZW50IHNjb3JlcyB3ZXJlIGRpdmlkZWQgaW50byB0aHJlZSBwYXJ0cyBpbmNsdWRpbmcgYSBzaW1pbGFyIG51bWJlciBvZiBwYXJ0aWNpcGFudHMuIAoKIyMjIFJlc3VsdHMgCkJveXMgb2J0YWluZWQgaGlnaGVyIGluYXR0ZW50aW9uIHNjb3JlcyBhbmQgbG93ZXIgYWNhZGVtaWMgc2NvcmVzIHRoYW4gZ2lybHMuIEluYXR0ZW50aW9uIHByb2JsZW1zIHJlbGF0ZWQgdG8gc3VzdGFpbmVkIGF0dGVudGlvbiBhbmQgZGlzdHJhY3RpYmlsaXR5IHR1cm5lZCBvdXQgdG8gaGF2ZSB0aGUgaGlnaGVzdCBwcmVkaWN0aXZlIHZhbHVlIG9mIGFjYWRlbWljIGFjaGlldmVtZW50IGxldmVsIGFjcm9zcyBhbGwgc2VsZWN0ZWQgc3RhdGlzdGljYWwgYW5hbHlzZXMsIGFuZCB0aGUgZnVsbCBtb2RlbCBzaG93ZWQgdGhhdCBpbmF0dGVudGlvbiBleHBsYWluZWQgYWJvdXQgMTBcJSBvZiB0aGUgdmFyaWFuY2UgaW4gaGlnaCBzY2hvb2wgc2NvcmVzIGFib3V0IDEwIHllYXJzIGxhdGVyLiBBIGhpZ2ggb2Rkcy1yYXRpb24gb2YgYmVpbmcgYWxsb2NhdGVkIHRvIHRoZSBsb3dlc3QgYWNhZGVtaWMgYWNoaWV2ZW1lbnQgY2F0ZWdvcnkgd2FzIHNob3duIGJ5IGEgbXVsdGlub21pbmFsIHJlZ3Jlc3Npb24gYW5hbHlzaXMsIHdoaWxlIGEgcGF0dGVybiBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIHN1c3RhaW5lZCBhdHRlbnRpb24gYW5kIGRpc3RyYWN0aWJpbGl0eSB3YXMgcmV2ZWFsZWQgYnkgZ2VuZXJhdGluZyBjbGFzc2lmaWNhdGlvbiB0cmVlcy4gQnkgaW5jbHVkaW5nIHJlY3Vyc2l2ZSBsZWFybmluZyBhbGdvcml0aG1zLCB0aGUgbW9zdCBzdWNjZXNzZnVsIGNsYXNzaWZpY2F0aW9uIHdhcyBmb3VuZCBiZXR3ZWVuIHRoZXNlIGluYXR0ZW50aW9uIGl0ZW1zIGFuZCB0aGUgaGlnaGVzdCBsZXZlbCBvZiBhY2hpZXZlbWVudCBzY29yZXMuIAoKIyMjIFN1bW1hcnkgClRoZSBwcmVzZW50IHN0dWR5IHNob3dlZCB0aGUgaW1wb3J0YW5jZSBvZiBhIHBhdHRlcm4gb2YgZWFybHkgcHJvYmxlbXMgcmVsYXRlZCB0byBzdXN0YWluZWQgYXR0ZW50aW9uIGFuZCBkaXN0cmFjdGliaWxpdHkgaW4gcHJlZGljdGluZyBmdXR1cmUgYWNhZGVtaWMgcmVzdWx0cy4gQnkgaW5jbHVkaW5nIGRpZmZlcmVudCBzdGF0aXN0aWNhbCBjbGFzc2lmaWNhdGlvbiBtb2RlbHMgd2Ugc2hvd2VkIHRoYXQgdGhpcyBwYXR0ZXJuIHdhcyBmYWlybHkgY29uc2lzdGVudC4gRnVydGhlcm1vcmUsIGNhbGN1bGF0aW9uIG9mIGNsYXNzaWZpY2F0aW9uIGVycm9ycyBnYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1bmNlcnRhaW50eSB3aGVuIHByZWRpY3RpbmcgdGhlIG91dGNvbWUgZm9yIGluZGl2aWR1YWwgY2hpbGRyZW4uIEZ1cnRoZXIgc3R1ZGllcyBzaG91bGQgaW5jbHVkZSBhIHdpZGVyIHJhbmdlIG9mIHZhcmlhYmxlcy4gCgoKCgo8c21hbGw+T3JnYW5pemF0aW9uIG9mIHRoZSBkYXRhIGFuZCB0aGUgYW5hbHlzaXM6PC9zbWFsbD4KCkxpYnJhcmllcyBiZWluZyB1c2VkOgoKKiBtZW1pc2MgLSBzcHNzLnN5c3RlbS5maWxlKCkKKiBwc3ljaCAgLSBoZWFkVGFpbCgpLCBkZXNjcmliZSgpCiogSG1pc2MgLSBkZXNjcmliZSgpCiogcGFuZGVyIC0gcGFuZGVyKCksIHBhbmRlck9wdGlvbnMoKQoKPGltZyBzcmM9Ii4uL2ltYWdlcy9EYXRhX3RvX2NsYXNzZXNfMjAxNjAyMDVfcHB0eC5qcGciIHdpZHRoPSI1MDBweCIgaGVpZ2h0PSI1MDBweCIgLz4KCiMjIyBEYXRhIHByZXBhcmF0aW9uCgpJbnB1dCBmaWxlOgoKICogaW5hdHRlbnRpb25fQXJ2aWRfbmV3LnNhdiAoZnJvbSBBc3RyaSwgb24gfi9Ecm9wYm94L0FydmlkX2luYXR0ZWlvbi9kYXRhMikKICogaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTIuY3N2CiAKT3V0cHV0IGZpbGVzIChkYXRhKToKCiAqIGluYXR0ZW50aW9uX25vbWlzc18yMzk3eDEyX3NuYXBfaXNfMF8xXzIuY3N2CiAqIGluYXR0ZW50aW9uX25vbWlzc18yMzk3eDEyX3NuYXBfaXNfMF8xLmNzdgogKiBpbmF0dGVudGlvbl9ub21pc3NfMjM5N3gxMl9zbmFwX2lzXzBfMV8yX291dGNvbWVfaXNfTF9NX0guY3N2IChMb3csIE1lZGl1bSwgSGlnaCBhY2FkZW1pYyBzY29yZSkKICogaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTJfc25hcF9pc18wXzFfMl9vdXRjb21lX2lzXzBfMV8yLmNzdiAoYWxsIG51bWVyaWNhbCkKICogaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTJfc25hcF9pc19OX1NfQ19vdXRjb21lX2lzX0xfTV9ILmNzdiAoTm90LCBTb21ld2hhdCwgQ2VydGFpbmx5IHRydWUpCiAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0gCiMgZm4gPC0gIi4uL2RhdGEyL2luYXR0ZW50aW9uX0FydmlkX25ldy5zYXYiCmZuIDwtICIuLi9Ecm9wYm94L0FydmlkX2luYXR0ZWlvbi9kYXRhMi9pbmF0dGVudGlvbl9BcnZpZF9uZXcuc2F2IgpgYGAKCgpgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CiMgVGhlIG9yaWdpbmFsIFNQU1MgZmlsZSBhcyBwcm92aWRlZCB0byBBSkwgaXMKIyAnaW5hdHRlbnRpb25fQXN0cmlfOTRfOTZfbmV3X2dyYWRlc191cGRhdGVkLnNhdicKIyBhbmQgYmVpbmcgZWRpdGVkIGFuZCByZWR1Y2VkIGJ5IEFKTCB0byAnaW5hdHRlbnRpb25fQXJ2aWRfbmV3LnNhdicKIyBJbXBvcnQgZGF0YSBzdG9yZWQgaW4gdGhlIFNQU1MgZm9ybWF0CmxpYnJhcnkobWVtaXNjKQojIGZuIDwtICIuLi9kYXRhMi9pbmF0dGVudGlvbl9BcnZpZF9uZXcuc2F2IgpmbiA8LSAiL1VzZXJzL2FydmlkL0Ryb3Bib3gvQXJ2aWRfaW5hdHRlbnRpb24vZGF0YTIvaW5hdHRlbnRpb25fQXJ2aWRfbmV3LnNhdiIKZGF0YSA8LSBhcy5kYXRhLnNldChzcHNzLnN5c3RlbS5maWxlKGZuKSkKCiMgTWFrZSBuZXcgZGF0YSBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgd2l0aCB0aGUgdmFyaWFibGVzIAojIGdlbmRlciwgZ3JhZGUsIFNOQVAxLCAuLi4sIFNOQVA5ICh2YXJzICMxLTExKSBhbmQKIyBhY2FkZW1pY19hY2hpZXZlbWVudCAodmFyICM1MikgCm5hbWVzKGRhdGEpCmQgPC0gZGF0YVssIGMoMToxMSwgNTIpXQpkaW0oZCkKbmFtZXMoZCkKc3RyKGQpCnN1bW1hcnkoZCkKYGBgCgo8aW1nIHNyYz0iLi4vaW1hZ2VzL3N1bW1hcnlfZC5wbmciIHdpZHRoPSI1MDBweCIgaGVpZ2h0PSI1MDBweCIgLz4KCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBHZXQgb2JzZXJ2YXRpb25zIG9mIGRhdGEgZnJhbWUgdGhhdCBoYXZlIG1pc3NpbmcgdmFsdWVzIGFuZCB0aG9zZSB3aXRoIGNvbXBsZXRlIGNhc2VzCmxpYnJhcnkocHN5Y2gpCmQubWlzcyA8LSBkWyFjb21wbGV0ZS5jYXNlcyhkKSxdCmQubm9taXNzIDwtIGRbY29tcGxldGUuY2FzZXMoZCksXQpzdHIoZC5ub21pc3MpCmhlYWRUYWlsKGFzLmRhdGEuZnJhbWUoZC5ub21pc3MpKQpzdW1tYXJ5KGQubm9taXNzKQpEMSA8LSBkLm5vbWlzcyAgICMgRm9yIGxhdGVyIHVzZQpgYGAKCiMjIyAhIE1ha2UgYSB0YWJsZSBvZiBTTkFQMS05IGRpc3RyaWJ1dGlvbiBhY2NvcmRpbmcgdG8gTm90IHRydWUsIFNvbWV3aGF0IFRydWVyIENlcnRhaW5seSB0cnUgZm9yIGJveXMgYW5kIGdpcmxzIHNlcGFyYXRlbHkKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0Kc3VtbWFyeShEMSRzbmFwMVtEMSRnZW5kZXIgPT0gIkJveSJdKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9CiMgU2F2ZSB0aGUgbm9taXMgRCB0byBhbiAuY3N2IGZpbGUgd2l0aG91dCByb3cgbmFtZXMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMKRCA8LSBkLm5vbWlzcwp3cml0ZS5jc3YoRCwgZmlsZSA9ICIuLi9kYXRhMi9pbmF0dGVudGlvbl9ub21pc3NfMjM5N3gxMi5jc3YiLHJvdy5uYW1lcz1GQUxTRSkKYGBgCgoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQojIEZvciBzaW1wbGljaXR5LCB3ZSByZW5hbWUgKGFuZCB0cmFuc2xhdGUpIHRoZSB2YXJpYWJsZXMgbmFtZXMgaW4gdGhlIGRhdGFzZXQgRCB3aXRob3V0IGFueSBtaXNzaW5nCmxpYnJhcnkocGx5cikKZC5ub21pc3MgPC0gcmVhZC5jc3YoZmlsZSA9ICIuLi9kYXRhL2luYXR0ZW50aW9uX25vbWlzc18yMzk3eDEyLmNzdiIpCkQgPC0gZC5ub21pc3MKRCA8LSByZW5hbWUoRCwgYyhhY2FkZW1pY19hY2hpZXZlbWVudD0iYXZlIikpCkQkYXZlIDwtIGFzLm51bWVyaWMoRCRhdmUpCkQkc25hcDEgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAxKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDEgPC0gYXMubnVtZXJpYyhEJHNuYXAxKS0xCkQkc25hcDIgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAyKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDIgPC0gYXMubnVtZXJpYyhEJHNuYXAyKS0xCkQkc25hcDMgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAzKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDMgPC0gYXMubnVtZXJpYyhEJHNuYXAzKS0xCkQkc25hcDQgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA0KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDQgPC0gYXMubnVtZXJpYyhEJHNuYXA0KS0xCkQkc25hcDUgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA1KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDUgPC0gYXMubnVtZXJpYyhEJHNuYXA1KS0xCkQkc25hcDYgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA2KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDYgPC0gYXMubnVtZXJpYyhEJHNuYXA2KS0xCkQkc25hcDcgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA3KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDcgPC0gYXMubnVtZXJpYyhEJHNuYXA3KS0xCkQkc25hcDggPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA4KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDggPC0gYXMubnVtZXJpYyhEJHNuYXA4KS0xCkQkc25hcDkgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA5KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIyIikpCkQkc25hcDkgPC0gYXMubnVtZXJpYyhEJHNuYXA5KS0xCkQkZ2VuZGVyIDwtIG1hcHZhbHVlcyhhcy5mYWN0b3IoRCRnZW5kZXIpLCBmcm9tID0gYygiR2lybCIsICJCb3kiKSwgdG8gPSBjKCIwIiwgIjEiKSkKRCRnZW5kZXIgPC0gYXMubnVtZXJpYyhEJGdlbmRlciktMQpEJGdyYWRlIDwtIGFzLm51bWVyaWMoRCRncmFkZSkKc3RyKEQpCmhlYWRUYWlsKEQpCkQzIDwtIEQgICAjIEZvciBsYXRlciB1c2UKYGBgCgpgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CiMgU2F2ZSBEIChhdCBlYXJseSBzdGFnZSkgdG8gYW4gLmNzdiBmaWxlIGZvciBsYXRlciBhbmFseXNpcyBpbiBSIG9yIE1BVExBQiAKd3JpdGUuY3N2KEQsIGZpbGUgPSAiLi4vZGF0YS9pbmF0dGVudGlvbl9ub21pc3NfMjM5N3gxMl9zbmFwX2lzXzBfMV8yLmNzdiIscm93Lm5hbWVzPUZBTFNFKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBGb3IgZXZlbiBtb3JlIHNpbXBsaWNpdHksIHdlIHJlbmFtZSAoYW5kIHRyYW5zbGF0ZSkgdGhlIHZhcmlhYmxlcyBuYW1lcyBpbiB0aGUgZGF0YXNldCAKIyB3aXRob3V0IGFueSBtaXNzaW5nLCByZWR1Y2luZyB0aGUgcHJlZGljdG9yIGNhdGVnb3JpZXMgdG8gYmUgYmluYXJ5LCAKIyBpLmUuIGNvbGxhcHNpbmcgU05BUCB2YWx1ZXMgIjEiIGFuZCAiMiIgdG8gIjEiOgpsaWJyYXJ5KHBseXIpCkQgPC0gZC5ub21pc3MKRCA8LSByZW5hbWUoRCwgYyhhY2FkZW1pY19hY2hpZXZlbWVudD0iYXZlIikpCkQkYXZlIDwtIGFzLm51bWVyaWMoRCRhdmUpCkQkc25hcDEgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAxKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDEgPC0gYXMubnVtZXJpYyhEJHNuYXAxKS0xCkQkc25hcDIgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAyKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDIgPC0gYXMubnVtZXJpYyhEJHNuYXAyKS0xCkQkc25hcDMgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXAzKSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDMgPC0gYXMubnVtZXJpYyhEJHNuYXAzKS0xCkQkc25hcDQgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA0KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDQgPC0gYXMubnVtZXJpYyhEJHNuYXA0KS0xCkQkc25hcDUgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA1KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDUgPC0gYXMubnVtZXJpYyhEJHNuYXA1KS0xCkQkc25hcDYgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA2KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDYgPC0gYXMubnVtZXJpYyhEJHNuYXA2KS0xCkQkc25hcDcgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA3KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDcgPC0gYXMubnVtZXJpYyhEJHNuYXA3KS0xCkQkc25hcDggPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA4KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDggPC0gYXMubnVtZXJpYyhEJHNuYXA4KS0xCkQkc25hcDkgPC0gbWFwdmFsdWVzKGFzLmZhY3RvcihEJHNuYXA5KSwgZnJvbSA9IGMoIk5vdCB0cnVlIiwiU29tZXdoYXQgdHJ1ZSIsIkNlcnRhaW5seSB0cnVlIiksIHRvID0gYygiMCIsIjEiLCIxIikpCkQkc25hcDkgPC0gYXMubnVtZXJpYyhEJHNuYXA5KS0xCkQkZ2VuZGVyIDwtIG1hcHZhbHVlcyhhcy5mYWN0b3IoRCRnZW5kZXIpLCBmcm9tID0gYygiR2lybCIsICJCb3kiKSwgdG8gPSBjKCIwIiwgIjEiKSkKRCRnZW5kZXIgPC0gYXMubnVtZXJpYyhEJGdlbmRlciktMQpEJGdyYWRlIDwtIGFzLm51bWVyaWMoRCRncmFkZSkKc3RyKEQpCmhlYWRUYWlsKEQpCkQyIDwtIEQgICMgRm9yIGxhdGVyIHVzZQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBTYXZlIHRoZSBuZXcgRCB0byBhbiAuY3N2IGZpbGUgd2l0aG91dCByb3cgbmFtZXMgZm9yIGZ1cnRoZXIgYW5hbHlzaXMKd3JpdGUuY3N2KEQsIGZpbGUgPSAiLi4vZGF0YS9pbmF0dGVudGlvbl9ub21pc3NfMjM5N3gxMl9zbmFwX2lzXzBfMS5jc3YiLHJvdy5uYW1lcz1GQUxTRSkKYGBgCgoKCgoKIyMjIyBTdHJ1dHVyZSBvZiB0aGUgRCBkYXRhc2V0CgpgYGB7ciBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD00fQpEIDwtIEQzCnMgPC0gZGltKEQpCm4gPC0gc1sxXQpwIDwtIHNbMl0KdHh0ID0gc3ByaW50ZigiU3RydWN0dXJlIG9mIHRoZSAlZCB4ICVkIERBVEFTRVQiLCBuLCBwKQpwcmludCh0eHQpCgpsaWJyYXJ5KERpYWdyYW1tZVIpCgpuX3R4dCA9IHNwcmludGYoIkRhdGFzZXQgXG4gKE4gPSAlZCkiLCBuKTsKZ3ZpeiA8LSBnclZpeigiCiAgICAgICAgICAgICAgIyBDaXJjbGVzOiBwcmVkaWN0b3IgdmFyaWFibGVzOyBUcmlhbmdsZTogT3V0Y29tZSB2YXJpYWJsZQoKICAgICAgICAgICAgICBkaWdyYXBoIFN0cnVjdHVyZV9vZl90aGVfZGF0YXNldF9EIHsKCiAgICAgICAgICAgICAgIyBub2RlIGRlZmluaXRpb25zIHdpdGggc3Vic3RpdHV0ZWQgbGFiZWwgdGV4dAogICAgICAgICAgICAgIG5vZGUgW2ZvbnRuYW1lID0gSGVsdmV0aWNhXQogICAgICAgICAgICAgIDEgW2xhYmVsID0gJ0RhdGFzZXQgXG4gKE4gPSAyMzk3KScsIHNoYXBlPWJveF0KICAgICAgICAgICAgICAyIFtsYWJlbCA9ICdnZW5kZXIgXG4ge0dpcmwgKDApIHwgQm95ICgxKX0nLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgMyBbbGFiZWwgPSAnZ3JhZGUgXG4gezIgfCAzIHwgNH0nLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgNCBbbGFiZWwgPSAnYXZlIFxuIChhdmVyYWdlIG1hcmtzKSBcbiBbMSwgNl0gb3Ige2xvdyAoTCkgfCBtZWRpdW0gKE0pIHwgaGlnaCAoSCl9Jywgc2hhcGU9dHJpYW5nbGVdCiAgICAgICAgICAgICAgYSBbbGFiZWwgPSAnU05BUCBcbiB7MCB8IDEgfCAyfScsIHNoYXBlPW92YWxdCiAgICAgICAgICAgICAgYiBbbGFiZWwgPSAnU05BUDEnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgYyBbbGFiZWwgPSAnU05BUDInLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgZCBbbGFiZWwgPSAnU05BUDMnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgZSBbbGFiZWwgPSAnU05BUDQnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgZiBbbGFiZWwgPSAnU05BUDUnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgZyBbbGFiZWwgPSAnU05BUDYnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgaCBbbGFiZWwgPSAnU05BUDcnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgaSBbbGFiZWwgPSAnU05BUDgnLCBzaGFwZT1jaXJjbGVdCiAgICAgICAgICAgICAgaiBbbGFiZWwgPSAnU05BUDknLCBzaGFwZT1jaXJjbGVdCgogICAgICAgICAgICAgICMgZWRnZSBkZWZpbml0aW9ucyB3aXRoIHRoZSBub2RlIElEcwogICAgICAgICAgICAgIDEgLT4gezIgMyBhIDR9CiAgICAgICAgICAgICAgYSAtPiB7YiBjIGQgZSBmIGcgaCBpIGp9CiAgICAgICAgICAgICAgfSIsCmVuZ2luZSA9ICJkb3QiKQoKcHJpbnQoZ3ZpeikKCiMgVGhpcyBkb2VzIG5vdCB3b3JrIHVzaW5nIERpYWdyYW1tZVIgLyBHcmFwaFZpegojIHBuZygiLi4vbWFudXNjcmlwdC9GaWdzL2dyYXBoX2Rlc2lnbi5wbmciKQojIHByaW50KGd2aXopCiMgZGV2Lm9mZigpCiMgVXNlcyBWaWV3ZXIsIFpvb20gYW5kIFNjcmVlbiBjYXB0dXJlIHRvIHByb2R1Y2UgLnBuZyBhbmQgdGhlbgojIGRhdGFfcHJlcF9zdHJ1Y3R1cmVfZ3J2aXpfMjAxNjAyMDMucGRmIGZpbGUKYGBgCgojIyMjIFRoZSBkYXRhc2V0IHRoYXQgd2lsbCBiZSBhbmFseXplZCBhbmQgcmVwb3J0ZWQKCkluIG91ciBhbmFseXNpcyB3ZSBpbmNsdWRlZCBuID0gYHIgbnJvdyhEKWAgaW5kaXZpZHVhbHMgKG5vbmUgd2l0aCBtaXNzaW5nIGRhdGEpIGZyb20gCnRoZSBkYXRhc2V0ICJgciBmbmAiLiAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KRCA8LSBEMwpuX3R4dCA9IHNwcmludGYoIkluIG91ciBhbmFseXNpcyB3ZSBpbmNsdWRlZCBuID0gJWQgaW5kaXZpZHVhbHMgKG5vbmUgd2l0aCBtaXNzaW5nIGRhdGEpIGZyb20gdGhlIGRhdGFzZXQgJyVzJ1xuIiwgbnJvdyhEKSwgZm4pOwpwcmludChuX3R4dCkKYGBgCgoKIyMjIyBHcmFkZXMgKGNvbnRpbnVvdXMgYW5kIGNhdGVnb3JpemVkKQoKV2UgY29uc2lkZXIgdGhlIGdyYWRlcyAoYWNhZGVtaWNfYWNoaWV2ZW1lbnQpLCBhcyBib3RoIGEgY29udGludW91cyAoZm9yIHJlZ3Jlc3Npb24pIGFuZCAKZGlzY3JldGl6ZWQgdmFyaWFibGUgKGZvciBjbGFzc2lmaWNhdGlvbiksIHdoZXJlCipnamVubm9tc25pdHQqOiAtIEl0ZW0gJ0thcmFrdGVyZ2plbm5vbXNuaXR0IGFsbGUgZ3lsZGlnZSBrYXJha3RlcmVyIDEtNiAoaWtrZSBrcm9wcHPDuHZpbmcpJyAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBEaXNjcmV0aXplZCBhdCB0aHJlZSBsZXZlbHMsIHdpdGggZGF0YS1kcml2ZW4gY3V0cG9pbnRzIChlcXVpZnJlcXVlbnQgbGV2ZWxzKQpEIDwtIEQzCmF2ZXIgPC0gRCRhdmUKc3VtbWFyeShhdmVyKQpiaW5zIDwtIDMKY3V0cG9pbnRzPC1xdWFudGlsZShhdmVyLCgwOmJpbnMpL2JpbnMsbmFtZXM9RkFMU0UpCnByaW50KGN1dHBvaW50cykKCiMgQ29uc2lzdGVudCB3aXRoIE1BVExBQiAnaGlzdGNvdW50cycgKERfMjAxNTExMTBfYW5hbHlzaXMubSAgOyAgVDIpCiMgZm4yID0gJy4uL2RhdGEvRF8yMDE1MTExMC5jc3YnOwojIFQyID0gcmVhZHRhYmxlKGZuMik7CiMgYmlucyA9IDM7CiMgeSA9IHF1YW50aWxlKFQyLmF2ZSxbMDpiaW5zXS9iaW5zKQojIFtOLEVER0VTLEJJTl0gPSBoaXN0Y291bnRzKFQyLmF2ZSx5KTsKIyBjdXRzID0gc3ByaW50ZignMTpbJS4yZiwgJS4yZikgMjpbJS4yZiwlLjJmKSAzOlslLjJmLCUuMmZdJywgRURHRVMoMSksIEVER0VTKDIpLCBFREdFUygyKSwgRURHRVMoMyksIEVER0VTKDMpLCBFREdFUyg0KSk7CiMgVDIuYXZlX2NhdCA9IEJJTjsgICAlIGNhdGVnb3JpY2FsKEJJTiwnT3JkaW5hbCcsdHJ1ZSk7CiMgZGVzY3IgPSBzcHJpbnRmKCclcyAtIDE6bG93LCAyOm1lZGl1bTsgMzpoaWdoIGF2ZXJhZ2UgbWFyaycsIGN1dHMpOwojIFQyLlByb3BlcnRpZXMuVmFyaWFibGVEZXNjcmlwdGlvbnN7J2F2ZV9jYXQnfSA9IGRlc2NyOwojID0+IGRlc2NyID0gMTpbMS4wMCwgMy43NSkgMjpbMy43NSw0LjQzKSAzOls0LjQzLDUuOTBdIC0gMTpsb3csIDI6bWVkaXVtOyAzOmhpZ2ggYXZlcmFnZSBtYXJrCmBgYApgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CmF2ZXJCaW5uZWQgPC0gY3V0KGF2ZXIsIGN1dHBvaW50cywgcmlnaHQ9RkFMU0UsIGluY2x1ZGUubG93ZXN0PVRSVUUpCnN1bW1hcnkoYXZlckJpbm5lZCkKYGBgCgpNYWtlIGhpc3RvZ3JhbSBvZiBkaWNyZXRpemVkICdhdmVyQmlubmVkJzoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQpoaXN0KGFzLm51bWVyaWMoYXZlckJpbm5lZCkpCmBgYAoKRGVmaW5lICpncmFkZSBjYXRlZ29yaWVzKiAibG93IiwgIm1lZGl1bSIgYW5kICJoaWdoIiBpbiB0ZXJtcyBvZiB0aGUgY2FsY3VsYXRlZCBjdXQtcG9pbnQgaW50ZXJ2YWxzOgoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQp0eHRfbG93IDwtIHNwcmludGYoImxvdyAoTCk6IFslLjNmLCAlLjNmKVxuIiwgY3V0cG9pbnRzW1sxXV0sIGN1dHBvaW50c1tbMl1dKQpwcmludCh0eHRfbG93KQp0eHRfbWVkaXVtIDwtIHNwcmludGYoIm1lZGl1bSAoTSk6IFslLjNmLCAlLjNmKVxuIiwgY3V0cG9pbnRzW1syXV0sIGN1dHBvaW50c1tbM11dKQpwcmludCh0eHRfbWVkaXVtKQp0eHRfaGlnaCA8LSBzcHJpbnRmKCJoaWdoIEgpOiBbJS4zZiwgJS4zZl1cbiIsIGN1dHBvaW50c1tbM11dLCBjdXRwb2ludHNbWzRdXSkKcHJpbnQodHh0X2hpZ2gpCmBgYAoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQpsaWJyYXJ5KHBzeWNoKQojIERhdGFzZXQgZm9yIGNsYXNzaWZpY2F0aW9uIGJhc2VkIG9uIEQzIGFuZCBkaXNjcmV0aXplZCBhdmVyYWdlIGFjYWRlbWljIGFjaGlldmVtbnQKQyA8LSBEMwpDJGF2ZXJCaW5uZWQgPC0gY3V0KGF2ZXIsIGN1dHBvaW50cywgcmlnaHQ9RkFMU0UsIGluY2x1ZGUubG93ZXN0PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJMIiwiTSIsIkgiKSkKQyA8LSBzdWJzZXQoQywgc2VsZWN0ID0gLWMoYXZlKSkKc3RyKEMpCmhlYWRUYWlsKGFzLmRhdGEuZnJhbWUoQykpCmhlYWRUYWlsKGFzLmRhdGEuZnJhbWUoRDMpKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBTYXZlIHRoZSBkYXRhc2V0IEMgd2l0aCBiaW5hcnkgU05BUCBwcmVkaWN0b3JzIGFuZCB0cmluYXJ5IG91dGNvbWUgdG8gYW4gLmNzdiBmaWxlIAojIGZvciBmdXJ0aGVyIGFuYWx5c2lzCndyaXRlLmNzdihDLCBmaWxlID0gIi4uL2RhdGEvaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTJfc25hcF9pc18wXzFfMl9vdXRjb21lX2lzX0xfTV9ILmNzdiIscm93Lm5hbWVzPUZBTFNFKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBEYXRhc2V0IGZvciBjbGFzc2lmaWNhdGlvbiBiYXNlZCBvbiBEMyBhbmQgZGlzY3JldGl6ZWQgYXZlcmFnZSBhY2FkZW1pYyBhY2hpZXZlbW50CkUgPC0gRDMKRSRhdmVyQmlubmVkIDwtIGN1dChhdmVyLCBjdXRwb2ludHMsIHJpZ2h0PUZBTFNFLCBpbmNsdWRlLmxvd2VzdD1UUlVFLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiMCIsIjEiLCIyIikpCkUgPC0gc3Vic2V0KEUsIHNlbGVjdCA9IC1jKGF2ZSkpCnN0cihFKQpzdW1tYXJ5KEUpCmhlYWRUYWlsKGFzLmRhdGEuZnJhbWUoRSkpCmhlYWRUYWlsKGFzLmRhdGEuZnJhbWUoRDMpKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KIyBTYXZlIHRoZSBkYXRhc2V0IEUgd2l0aCBudW1lcmljYWwgU05BUCBwcmVkaWN0b3JzIGFuZCB0cmluYXJ5IG91dGNvbWUgdG8gYW4gLmNzdiBmaWxlIAojIGZvciBmdXJ0aGVyIGFuYWx5c2lzCndyaXRlLmNzdihFLCBmaWxlID0gIi4uL2RhdGEvaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTJfc25hcF9pc18wXzFfMl9vdXRjb21lX2lzXzBfMV8yLmNzdiIscm93Lm5hbWVzPUZBTFNFKQpgYGAKCiMjIyMgQ29udmVydGluZyBudW1lcmljYWwgdmFyaWFibGVzIHRvIGZhY3RvcnMKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KbGlicmFyeSh4dGFibGUpCkMgPC0gYXMuZGF0YS5mcmFtZShDKQojIHNlbGVjdCBjb2x1bW5zCmNvbHMgPC0gYygiZ2VuZGVyIiwgImdyYWRlIiwgInNuYXAxIiwgInNuYXAyIiwgInNuYXAzIiwgInNuYXA0IiwgInNuYXA1IiwgInNuYXA2IiwgInNuYXA3IiwgInNuYXA4IiwgInNuYXA5IiwgImF2ZXJCaW5uZWQiKQpDWyxjb2xzXSA8LSBkYXRhLmZyYW1lKGFwcGx5KENbY29sc10sIDIsIGFzLmZhY3RvcikpCgpsZXZlbHMoQyRnZW5kZXIpIDwtIGMoIkciLCAiQiIpCmxldmVscyhDJGdyYWRlKSA8LSBjKCIybmQiLCAiM3JkIiwgIjR0aCIpCiMgTiAtIG5vdCB0cnVlICgwKQojIFMgLSBzb21ld2hhdCB0cnVlICgxKQojIEMgLSBjZXJ0YWlubHkgdHJ1ZSAoMikKbGV2ZWxzKEMkc25hcDEpIDwtIGMoIk4iLCAiUyIsICJDIikgIApsZXZlbHMoQyRzbmFwMikgPC0gYygiTiIsICJTIiwgIkMiKSAgCmxldmVscyhDJHNuYXAzKSA8LSBjKCJOIiwgIlMiLCAiQyIpICAKbGV2ZWxzKEMkc25hcDQpIDwtIGMoIk4iLCAiUyIsICJDIikgIApsZXZlbHMoQyRzbmFwNSkgPC0gYygiTiIsICJTIiwgIkMiKSAgCmxldmVscyhDJHNuYXA2KSA8LSBjKCJOIiwgIlMiLCAiQyIpICAKbGV2ZWxzKEMkc25hcDcpIDwtIGMoIk4iLCAiUyIsICJDIikgIApsZXZlbHMoQyRzbmFwOCkgPC0gYygiTiIsICJTIiwgIkMiKSAgCmxldmVscyhDJHNuYXA5KSA8LSBjKCJOIiwgIlMiLCAiQyIpCmxldmVscyhDJGF2ZXJCaW5uZWQpIDwtIGMoIkgiLCAiTCIsICJNIikgICAgIyBudW1lcmljYWwgb3JkZXIgPSBhbHBoYWJldGljYWwgb3JkZXIKc3RyKEMpCmhlYWRUYWlsKEMpCnN1bW1hcnkoQykKeHRhYmxlKHN1bW1hcnkoQykpCmBgYAoKYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQojIFNhdmUgdGhlIGRhdGFzZXQgQyB3aXRoIFNOQVAgcHJlZGljdG9ycyBhcyBmYWN0b3JzIGFuZCB0cmluYXJ5IG91dGNvbWUgdG8gYW4gLmNzdiBmaWxlIAojIGZvciBmdXJ0aGVyIGFuYWx5c2lzCndyaXRlLmNzdihDLCBmaWxlID0gIi4uL2RhdGEvaW5hdHRlbnRpb25fbm9taXNzXzIzOTd4MTJfc25hcF9pc19OX1NfQ19vdXRjb21lX2lzX0xfTV9ILmNzdiIscm93Lm5hbWVzPUZBTFNFKQpgYGAKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KbGlicmFyeShIbWlzYykKZGVzY3JpYmUoQykKYGBgCgpgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CmxpYnJhcnkocGFuZGVyKQpwYW5kZXJPcHRpb25zKCJkaWdpdHMiLCA1KQpwYW5kZXIoc3VtbWFyeShDKSkKcGFuZGVyKHN1bW1hcnkoRSkpCmBgYAoKCgpEZXNjcmliZSBzdWJzZXRzIG9mIGRhdGEgYWNjb3JkaW5nIHRvIGFjYWRlbWljIGFjaGlldmVtZW50IGFuZCBnZW5kZXIKCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KQy5naXJscy5MIDwtIENbIHdoaWNoKEMkZ2VuZGVyPT0nRycgJiBDJGF2ZXJCaW5uZWQ9PSdMJyksIF0KQy5naXJscy5IIDwtIENbIHdoaWNoKEMkZ2VuZGVyPT0nRycgJiBDJGF2ZXJCaW5uZWQ9PSdIJyksIF0KQy5ib3lzLkwgPC0gQ1sgd2hpY2goQyRnZW5kZXI9PSdCJyAmIEMkYXZlckJpbm5lZD09J0wnKSwgXQpDLmJveXMuSCA8LSBDWyB3aGljaChDJGdlbmRlcj09J0InICYgQyRhdmVyQmlubmVkPT0nSCcpLCBdCnN1bW1hcnkoQy5naXJscy5MKQpzdW1tYXJ5KEMuZ2lybHMuSCkKc3VtbWFyeShDLmJveXMuTCkKc3VtbWFyeShDLmJveXMuSCkKbGlicmFyeShIbWlzYykKZGVzY3JpYmUoQy5naXJscy5MKQpkZXNjcmliZShDLmdpcmxzLkgpCmRlc2NyaWJlKEMuYm95cy5MKQpkZXNjcmliZShDLmJveXMuSCkKYGBgCg==